import router from './router'
import store from './store'
import { Message } from 'element-ui'
import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style
import { getToken, isTokenExpired } from '@/utils/auth' // get token from cookie
import getPageTitle from '@/utils/get-page-title'

NProgress.configure({ showSpinner: false }) // NProgress Configuration

// 白名单路径，不需要登录即可访问
const whiteList = ['/login', '/register'] 

router.beforeEach(async(to, from, next) => {
  // 开始进度条
  NProgress.start()

  // 设置页面标题
  document.title = getPageTitle(to.meta.title)

  // 获取用户token
  const hasToken = getToken()

  // 判断用户是否已登录
  if (hasToken) {
    // 检查token是否已过期
    if (isTokenExpired()) {
      // token已过期，提示重新登录
      Message({
        message: 'token已过期，请重新登录',
        type: 'warning',
        duration: 2000
      })
      
      await store.dispatch('user/resetToken')
      next(`/login?redirect=${to.path}`)
      NProgress.done()
      return
    }
    
    if (to.path === '/login' || to.path === '/') {
      // 如果已登录，重定向到dashboard页面
      next({ path: '/dashboard' })
      NProgress.done()
    } else {
      // 确定用户是否已获取其用户信息
      const hasUserInfo = store.getters.name
      
      if (hasUserInfo) {
        next()
      } else {
        try {
          // 获取用户信息（优先从JWT中解析）
          const userInfo = await store.dispatch('user/getInfo')
          
          // 根据用户状态判断是否允许访问
          const userStatus = store.getters.status
          
          // 检查用户状态是否正常 (status === 1 表示账号正常)
          if (userStatus !== 1) {
            // 账号状态异常
            await store.dispatch('user/resetToken')
            Message.error('账号状态异常，请联系管理员')
            next(`/login?redirect=${to.path}`)
            NProgress.done()
          } else {
            // JWT特有：可以根据用户角色决定能访问哪些路由
            // const roles = userInfo.roles || store.getters.roles
            // 这里可以根据角色动态添加路由
            // 如果没有这个需求，直接放行
            next()
          }
        } catch (error) {
          console.error('获取用户信息失败，但仍允许访问:', error)
          
          // 创建默认用户信息替代后端数据
          store.commit('user/SET_NAME', localStorage.getItem('username') || 'Guest User')
          store.commit('user/SET_AVATAR', '')
          store.commit('user/SET_STATUS', 1) // 默认设置状态为正常
          
          Message({
            message: '获取用户信息失败，将使用默认信息',
            type: 'warning',
            duration: 3000
          })
          next() // 仍然允许用户访问系统
        }
      }
    }
  } else {
    /* 没有token */
    if (whiteList.indexOf(to.path) !== -1) {
      // 在免登录白名单中，直接进入
      next()
    } else {
      // 显示"请先登录"提示消息
      Message({
        message: '请先登录',
        type: 'warning',
        duration: 2000,
        onClose: () => {
          // 提示消息关闭后跳转到登录页
          next(`/login?redirect=${to.path}`)
        }
      })
      
      // 立即跳转到登录页面（不等待消息关闭）
      next(`/login?redirect=${to.path}`)
      NProgress.done()
    }
  }
})

router.afterEach(() => {
  // 完成进度条
  NProgress.done()
}) 